package com.atguigu.lease.common.redis;

import org.checkerframework.checker.units.qual.C;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfigruation {

    //Redis 本身只支持字节流作为存储内容。
    //所以无论是键（Key）还是值（Value），都需要被序列化为字节数组写入 Redis，
    // 从 Redis 读取时也需要反序列化回 Java 对象
    /**
 * 配置RedisTemplate以使用自定义的序列化方式
 * 该方法在Spring框架中定义了一个Bean，用于创建和配置RedisTemplate实例
 * RedisTemplate是Spring Data Redis提供的用于操作Redis数据的模板类，它需要一个RedisConnectionFactory来建立连接
 *
 * @param redisConnectionFactory Redis连接工厂，用于创建和管理Redis的连接
 * @return 返回一个配置好的RedisTemplate实例，用于进行Redis数据操作
 */
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
    // 创建RedisTemplate实例
    RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
    // 设置连接工厂
    redisTemplate.setConnectionFactory(redisConnectionFactory);

    // 使用UTF-8编码方式的StringRedisSerializer作为键的序列化器
    StringRedisSerializer stringRedisSerializer = StringRedisSerializer.UTF_8;
    // 使用GenericJackson2JsonRedisSerializer作为值的序列化器，它可以将对象序列化为JSON格式的字节数组
    GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer =
            new GenericJackson2JsonRedisSerializer();

    // 设置键的序列化器
    redisTemplate.setKeySerializer(stringRedisSerializer);
    // 设置Hash类型键的序列化器
    redisTemplate.setHashKeySerializer(stringRedisSerializer);
    // 设置值的序列化器
    redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
    // 设置Hash类型值的序列化器
    redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);

    // 返回配置好的RedisTemplate实例
    return redisTemplate;
}

}
